﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CALTypeLib;
using EntitiesLayer;
using Bitacora;
using System.Drawing;
using System.Drawing.Imaging;
using DataLayer;
namespace BusinessLayer
{
    /// <summary>
    /// Clase que permite la creación y envío de documentos en el flujo de trabajo de InfoImage.
    /// </summary>
    public class IIF_WorkItem : IIF_Connection
    {
        public IIF_WorkItem()
        {
            if (!(base.CrearClienteIIF(Configuracion.usuarioIIF, Configuracion.passwordIIF, Configuracion.dominioIIF)))
                throw new Exception("Imposible abrir conexion con InfoImage, favor revisar las Bitacoras");
        }

        #region Recursos Globales

        private CALDocument calDocument;
        private CALFormFields calFormFields;
        private CALIndexFields calIndexFields;
        private CALPage calPage;
        private CALPages calPages;
        private CALQueue calQueue = new CALQueue();

        private CALWorkitemInfo calWorkItemInfo;
    


        #endregion

        /// <summary>
        /// Método que permite la creación de un documento (Workitem) en InfoImage.
        /// </summary>
        /// <param name="cheque">Objeto tipo cheque con las entidades correspondientes.</param>
        /// <returns>True si la creación del documento en InfoImage fue correcta.</returns>
        public bool CrearWorkItem(Cheque cheque)
        {
            #region Create WorkItem

            try
            {
                    // Creando workitem

                    Services.EnviarLog("Unisys Batch Importer To IIF", 507, "Creando Workitem", "CrearWorkItem", Bitacora.TipoError.Informacion);

                    calWorkItemInfo = calClient.CreateDocument(cheque.camara.ObtenerCampo(Configuracion.campoNombre).valor, cheque.camara.claseInfoImage);

                    calClientListItem = calClientList.Add(calWorkItemInfo.ObjID, ClientListAddConstants.calAddRetain);
                    calDocument = calClientListItem.Open(OpenConstants.calOpenReadWrite);
                    calFormFields = calDocument.FormFields(FieldConstants.calFieldsNoViews);
                    // Workitem creado con éxito.                
                }
                catch(Exception e)
                {
                    Services.EnviarLog("Unisys Batch Importer To IIF",201, "Imposible crear WorkItem en InfoImage "+e.Message,"CrearWorkItem", Bitacora.TipoError.Informacion);
                    
                    return false;
                }
            #endregion

            #region Index Images
            if (cheque.estado != 5 && cheque.estado != 6)
            {
                if (!System.IO.File.Exists(cheque.imagenAnversa))
                {
                    Services.EnviarLog("Unisys Batch Importer To IIF", 101, "La imagen delantera no existe", "CrearWorkItem",Bitacora.TipoError.Error);                    
                    return false;
                }

                if (!System.IO.File.Exists(cheque.imagenReversa))
                {
                    Services.EnviarLog("Unisys Batch Importer To IIF", 102, "La imagen trasera no existe", "CrearWorkItem", Bitacora.TipoError.Error); 
                    return false;
                }

                if (Configuracion.imagenesComoImports)
                {

                    calDocument.Imports.Add(calDocument.Imports.Count + 1, "ANVERSO", "Scale2Gray", cheque.imagenAnversa);

                    calDocument.Imports.Add(calDocument.Imports.Count + 1, "REVERSO", "Scale2Gray", cheque.imagenReversa);
                }
                else
                {
                    try
                    {
                        Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Intentando agregar page como JPG: " + cheque.imagenAnversa, "CrearWorkItem", TipoError.Informacion);
                        calPages = (CALPages)calDocument.Pages;
                        Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Estableciendo pagina: " + calPages.Count+1, "CrearWorkItem", TipoError.Informacion);
                        Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Se establecieron las pages", "CrearWorkItem", TipoError.Informacion);
                        calPages.Add(calPages.Count + 1, "ANVERSO", cheque.imagenAnversa);
                        Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Se agregó page como JPG: " + cheque.imagenAnversa, "CrearWorkItem", TipoError.Informacion);
                    }
                    catch (Exception e)
                    {
                        try
                        {
                            Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Mensaje: "+e.Message.ToString()+" Detalle: "+e.ToString(), "CrearWorkItem", TipoError.Informacion);
                            Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Creando archivo TIFF: " + cheque.imagenAnversa + ".TIFF", "CrearWorkItem", TipoError.Informacion);
                            Bitmap image = new System.Drawing.Bitmap(Image.FromFile(cheque.imagenAnversa));
                            image.Save(cheque.imagenAnversa + ".TIFF", ImageFormat.Tiff);
                            Services.EnviarLog("Unisys Batch Importer To IIF", 0, "archivo TIFF creado: " + cheque.imagenAnversa + ".TIFF", "CrearWorkItem", TipoError.Informacion);

                            if (System.IO.File.Exists(cheque.imagenAnversa + ".TIFF"))
                            {
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "SI se encontró el archivo TIFF: " + cheque.imagenAnversa + ".TIFF", "CrearWorkItem", TipoError.Informacion);
                            }
                            else
                            {
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "NO se encontró el archivo TIFF: " + cheque.imagenAnversa + ".TIFF", "CrearWorkItem", TipoError.Informacion);
                            }

                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Agregando page como TIFF: " + cheque.imagenAnversa + ".TIFF", "CrearWorkItem", TipoError.Informacion);
                                //System.Threading.Thread.Sleep(10 * 1000);
                                calPages = (CALPages)calDocument.Pages;
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Se establecieron las pages", "CrearWorkItem", TipoError.Informacion);
                                calPages.Add(calPages.Count + 1, "ANVERSO", cheque.imagenAnversa + ".TIFF");
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Se agrego page como TIFF: " + cheque.imagenAnversa, "CrearWorkItem", TipoError.Informacion);

                            }
                            catch (Exception ex)
                            {
                                calDocument.Close(CloseConstants.calCloseAbortChanges);
                                LimpiarEscritorioClienteIIF();


                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "La imagen ANVERSO:'" + cheque.imagenAnversa + ".TIFF" + "' no fue indexada: " + ex.Message, "CrearWorkItem", Bitacora.TipoError.Error);
                                return false;
                            }
                    }

                    try
                    {
                        Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Intentando agregar page como JPG: " + cheque.imagenReversa, "CrearWorkItem", TipoError.Informacion);
                        calPages = (CALPages)calDocument.Pages;
                        Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Se establecieron las pages", "CrearWorkItem", TipoError.Informacion);
                        calPages.Add(calPages.Count + 1, "REVERSO", cheque.imagenReversa);
                        Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Se agregó page como JPG: " + cheque.imagenReversa, "CrearWorkItem", TipoError.Informacion);
                    }
                    catch (Exception e)
                    {
                        try
                            {
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Creando archivo TIFF: " + cheque.imagenReversa+ ".TIFF", "CrearWorkItem", TipoError.Informacion);
                            Bitmap image = new System.Drawing.Bitmap(Image.FromFile(cheque.imagenReversa));
                            image.Save(cheque.imagenReversa + ".TIFF", ImageFormat.Tiff);
                            Services.EnviarLog("Unisys Batch Importer To IIF", 0, "archivo TIFF creado: " + cheque.imagenReversa + ".TIFF", "CrearWorkItem", TipoError.Informacion);

                            if (System.IO.File.Exists(cheque.imagenReversa + ".TIFF"))
                            {
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "SI se encontró el archivo TIFF: " + cheque.imagenReversa + ".TIFF", "CrearWorkItem", TipoError.Informacion);
                            }
                            else
                            {
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "NO se encontró el archivo TIFF: " + cheque.imagenReversa + ".TIFF", "CrearWorkItem", TipoError.Informacion);
                            }

                            Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Agregando page como TIFF: " + cheque.imagenReversa + ".TIFF", "CrearWorkItem", TipoError.Informacion);
                                calPages = (CALPages)calDocument.Pages;
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Se establecieron las pages", "CrearWorkItem", TipoError.Informacion);
                                calPages.Add(calPages.Count + 1, "REVERSO", cheque.imagenReversa + ".TIFF");
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "Se agrego page como TIFF: " + cheque.imagenReversa, "CrearWorkItem", TipoError.Informacion);
                            }
                            catch (Exception ex) 
                            {
                                calDocument.Close(CloseConstants.calCloseAbortChanges);
                                LimpiarEscritorioClienteIIF();
                                Services.EnviarLog("Unisys Batch Importer To IIF", 0, "La imagen REVERSO:'" + cheque.imagenReversa + ".TIFF" + "' no fue indexada: " + ex.Message, "CrearWorkItem", Bitacora.TipoError.Error);
                                return false;
                            }
                    }
                }

                Services.EnviarLog("Unisys Batch Importer To IIF", 253, "Imagenes Indexadas al documento", "CrearWorkItem", Bitacora.TipoError.Informacion);
            }
            #endregion

            #region Index Data
            foreach (Field field in cheque.camara.camposValidos)
            {
                try
                {
                    if (field.requerido)
                    {
                        calFormFields.Find(field.nombreIIF).set_Value(1, field.valor);
                        Services.EnviarLog("Unisys Batch Importer To IIF", 253, "Campo [" + field.nombreIIF + "] Indexado con el valor [" + field.valor + "]", "CrearWorkItem", Bitacora.TipoError.Informacion);
                    }
                }
                catch (Exception e)
                {
                    Services.EnviarLog("Unisys Batch Importer To IIF", 202, "El campo [" + field.nombreIIF + "] no existe en el formulario de la clase [" + cheque.camara.claseInfoImage + "]", "CrearWorkItem", Bitacora.TipoError.Error, e);
                    return false;
                }
            }

            calFormFields.Find(Configuracion.campoDescripcion).set_Value(1, cheque.camara.movTarea);
            
            #endregion

            string name = calDocument.Info.Name;
            Services.EnviarLog("Unisys Batch Importer To IIF", 508, "Intentando guardar el documento [" + name + "] en workflow.", "CrearWorkItem", Bitacora.TipoError.Informacion);

            calDocument.Save();
            calDocument.Close(CloseConstants.calCloseSaveChanges);

            FilesManagement.BorrarArchivo(cheque.imagenAnversa + ".TIFF");
            FilesManagement.BorrarArchivo(cheque.imagenReversa + ".TIFF");

            

            Services.EnviarLog("Unisys Batch Importer To IIF", 509, "Enviando documento [" + name + "] a workflow.", "CrearWorkItem", Bitacora.TipoError.Informacion);

            return EnviarWorkflow(Configuracion.colaEnvioIIF,name);       
        }

        /// <summary>
        /// Método que permite enviar un documento de InfoImage a una cola (Workstep) en el flujo de trabajo actual.
        /// </summary>
        /// <param name="nombreCola">Nombre del Workstep (cola) al que sera enviado el documento.</param>
        /// <param name="nombreDocumento">Nombre del documento.</param>
        /// <returns>True, si el envío fue exitoso.</returns>
        private bool EnviarWorkflow(string nombreCola, string nombreDocumento)
        {
            try
            {
                //Establecer el nombre de la colaw.

                calQueue.Name = nombreCola;               
                calQueue.Type = QueueTypeConstants.calQueueTypeWorkstep;
                Services.EnviarLog("Unisys Batch Importer To IIF", 510, "Workstep [" + nombreCola + "] asignado.", "EnviarWorkflow", Bitacora.TipoError.Informacion);


                if (nombreCola.Equals(""))
                {                    
                    calClientListItem.SendToDefault(SendConstants.calSendDiscard);
                    Services.EnviarLog("Unisys Batch Importer To IIF", 255, "Workitem [" + nombreDocumento + "] enviado a la cola [Default].", "EnviarWorkflow", Bitacora.TipoError.Informacion);
                }
                else
                {
                    calClientListItem.Send(calQueue, SendConstants.calSendDiscard);
                    Services.EnviarLog("Unisys Batch Importer To IIF", 255, "Workitem [" + nombreDocumento + "] enviado a la cola [" + nombreCola + "].", "EnviarWorkflow", Bitacora.TipoError.Informacion);
                }
                return true;
            }
            catch (Exception exc)
            {
                Services.EnviarLog("Unisys Batch Importer To IIF",203, "Imposible enviar el documento a la cola", "EnviarWorkflow", Bitacora.TipoError.Error, exc);
                return false;
            }
        }

    }
}
